stylecontext: Move property cache
authorBenjamin Otte <otte@redhat.com>
Tue, 10 Jun 2014 22:30:30 +0000 (00:30 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 10 Jun 2014 23:18:05 +0000 (01:18 +0200)
... from per style data to only existing once per style context. This is
technically an API break because it no longer allows getting different
style properties between save()/restore() pairs, but I don't think this
was ever intended to work that way, as the style property API was to be
used and is used via gtk_widget_get_style().

And it simplifies code a lot.

gtk/gtkstylecontext.c

index 2f9b348f9922d8e7be79c9ae8905ac05f250e2f2..882dac189a7260018f746cc391a974ed91a3d083 100644 (file)
@@ -260,7 +260,6 @@ struct GtkStyleInfo
 struct StyleData
 {
   GtkCssComputedValues *store;
-  GArray *property_cache;
   guint ref_count;
 };
 
@@ -276,6 +275,7 @@ struct _GtkStyleContextPrivate
   GtkWidgetPath *widget_path;
   GHashTable *style_data;
   GtkStyleInfo *info;
+  GArray *property_cache;
   gint scale;
 
   guint frame_clock_update_id;
@@ -403,23 +403,20 @@ style_data_new (void)
 }
 
 static void
-clear_property_cache (StyleData *data)
+gtk_style_context_clear_property_cache (GtkStyleContext *context)
 {
+  GtkStyleContextPrivate *priv = context->priv;
   guint i;
 
-  if (!data->property_cache)
-    return;
-
-  for (i = 0; i < data->property_cache->len; i++)
+  for (i = 0; i < priv->property_cache->len; i++)
     {
-      PropertyValue *node = &g_array_index (data->property_cache, PropertyValue, i);
+      PropertyValue *node = &g_array_index (priv->property_cache, PropertyValue, i);
 
       g_param_spec_unref (node->pspec);
       g_value_unset (&node->value);
     }
 
-  g_array_free (data->property_cache, TRUE);
-  data->property_cache = NULL;
+  g_array_set_size (priv->property_cache, 0);
 }
 
 static StyleData *
@@ -439,7 +436,6 @@ style_data_unref (StyleData *data)
     return;
 
   g_object_unref (data->store);
-  clear_property_cache (data);
 
   g_slice_free (StyleData, data);
 }
@@ -640,6 +636,8 @@ gtk_style_context_init (GtkStyleContext *style_context)
   priv->info = style_info_new ();
   priv->info->state_flags = GTK_STATE_FLAG_DIR_LTR;
 
+  priv->property_cache = g_array_new (FALSE, FALSE, sizeof (PropertyValue));
+
   gtk_style_context_set_cascade (style_context,
                                  _gtk_settings_get_style_cascade (gtk_settings_get_for_screen (priv->screen)));
 }
@@ -775,6 +773,9 @@ gtk_style_context_finalize (GObject *object)
   while (priv->info)
     priv->info = style_info_pop (priv->info);
 
+  gtk_style_context_clear_property_cache (style_context);
+  g_array_free (priv->property_cache, TRUE);
+
   G_OBJECT_CLASS (gtk_style_context_parent_class)->finalize (object);
 }
 
@@ -2200,35 +2201,27 @@ _gtk_style_context_peek_style_property (GtkStyleContext *context,
 {
   GtkStyleContextPrivate *priv;
   PropertyValue *pcache, key = { 0 };
-  StyleData *data;
   guint i;
 
   priv = context->priv;
 
-  data = style_data_lookup (context);
-
   key.widget_type = widget_type;
   key.pspec = pspec;
 
   /* need value cache array */
-  if (!data->property_cache)
-    data->property_cache = g_array_new (FALSE, FALSE, sizeof (PropertyValue));
-  else
-    {
-      pcache = bsearch (&key,
-                        data->property_cache->data, data->property_cache->len,
-                        sizeof (PropertyValue), style_property_values_cmp);
-      if (pcache)
-        return &pcache->value;
-    }
+  pcache = bsearch (&key,
+                    priv->property_cache->data, priv->property_cache->len,
+                    sizeof (PropertyValue), style_property_values_cmp);
+  if (pcache)
+    return &pcache->value;
 
   i = 0;
-  while (i < data->property_cache->len &&
-         style_property_values_cmp (&key, &g_array_index (data->property_cache, PropertyValue, i)) >= 0)
+  while (i < priv->property_cache->len &&
+         style_property_values_cmp (&key, &g_array_index (priv->property_cache, PropertyValue, i)) >= 0)
     i++;
 
-  g_array_insert_val (data->property_cache, i, key);
-  pcache = &g_array_index (data->property_cache, PropertyValue, i);
+  g_array_insert_val (priv->property_cache, i, key);
+  pcache = &g_array_index (priv->property_cache, PropertyValue, i);
 
   /* cache miss, initialize value type, then set contents */
   g_param_spec_ref (pcache->pspec);
@@ -2996,6 +2989,8 @@ gtk_style_context_clear_cache (GtkStyleContext *context)
       style_info_set_data (info, NULL);
     }
   g_hash_table_remove_all (priv->style_data);
+
+  gtk_style_context_clear_property_cache (context);
 }
 
 static void
@@ -3025,6 +3020,8 @@ gtk_style_context_update_cache (GtkStyleContext  *context,
 
       _gtk_bitmask_free (changes);
     }
+
+  gtk_style_context_clear_property_cache (context);
 }
 
 static void